using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Text;
using Sinacor.Infra.Service.Data;
using Sinacor.Infra.Service.Security.Authorization;

namespace Sinacor.Servico.Bovespa.Corretagem.ResourceAccess
{
    /// <summary>
    /// Acesso a dados de beneficios de políticas de corretagem
    /// </summary>
    public class ControleBeneficio : BaseResourceAccess
    {
        #region Construtor

        public ControleBeneficio()
            : base(AuthorizationContext.Current.CompanyId)
        {
        }

        #endregion

        #region Métodos

        /// <summary>
        /// Consulta beneficios de politicas de corretagem conforme filtro
        /// </summary>
        /// <param name="entity"></param>
        public List<BusinessEntity.ControleBeneficio> ConsultarControlesBeneficios(BusinessEntity.Parameter.FiltroControleBeneficio entity)
        {
            List<BusinessEntity.ControleBeneficio> listaControleBeneficio = null;
            List<BusinessEntity.TipoBeneficio> listaTiposBeneficio = null;
            StringBuilder sql = new StringBuilder();

            listaTiposBeneficio = new TipoBeneficio().ConsultarTiposBeneficios(new BusinessEntity.Parameter.FiltroTipoBeneficio());

            using (DbCommand command = this.DataBase.GetSqlStringCommand(" "))
            {
                sql.AppendLine("SELECT");
                sql.AppendLine("    CD_POLITICA CodigoPolitica,");
                sql.AppendLine("    DT_INICIAL DataInicial,");
                sql.AppendLine("    TP_BENEF TipoBeneficio,");
                sql.AppendLine("    NR_VAL_QTDE ValorQuantidade");
                sql.AppendLine("FROM");
                sql.AppendLine("    TBOCORR_BENEF");
                sql.AppendLine("WHERE 1 = 1");

                //Filtros Opcionais
                if (entity.CodigoPolitica.HasValue)
                {
                    sql.AppendLine("AND CD_POLITICA = :CodigoPolitica");
                    this.DataBase.AddInParameter(command, "CodigoPolitica", DbType.Int32, entity.CodigoPolitica);
                }

                if (entity.DataInicial.HasValue)
                {
                    sql.AppendLine("AND DT_INICIAL = :DataInicial");
                    this.DataBase.AddInParameter(command, "DataInicial", DbType.DateTime, entity.DataInicial);
                }

                if (entity.TipoBeneficio != null)
                {
                    sql.AppendLine("AND TP_BENEF = :TipoBeneficio");
                    this.DataBase.AddInParameter(command, "TipoBeneficio", DbType.Int32, entity.TipoBeneficio);
                }

                if (entity.ValorQuantidade.HasValue)
                {
                    sql.AppendLine("AND NR_VAL_QTDE = :ValorQuantidade");
                    this.DataBase.AddInParameter(command, "ValorQuantidade", DbType.Decimal, entity.ValorQuantidade);
                }

                command.CommandText = sql.ToString();

                listaControleBeneficio = this.FindAll<BusinessEntity.ControleBeneficio>(command, reader => new BusinessEntity.ControleBeneficio

                {
                    CodigoPolitica = reader.GetValue<int>("CodigoPolitica"),
                    DataInicial = reader.GetValue<DateTime>("DataInicial"),
                    TipoBeneficio = new Sinacor.Servico.Bovespa.Corretagem.BusinessEntity.TipoBeneficio { Codigo = reader.GetValue<int>("TipoBeneficio") },
                    ValorQuantidade = reader.GetValue<decimal>("ValorQuantidade")
                });
            }

            foreach (BusinessEntity.ControleBeneficio entidade in listaControleBeneficio)
            {
                entidade.TipoBeneficio = (from tipoBeneficio in listaTiposBeneficio where tipoBeneficio.Codigo == entidade.TipoBeneficio.Codigo select tipoBeneficio).First<BusinessEntity.TipoBeneficio>();
            }

            return listaControleBeneficio;
            
        }

        /// <summary>
        /// Exclui todos os benefícios de uma política de corretagem do banco de dados.
        /// </summary>
        /// <param name="entity"></param>
        public void ExcluirTodosBeneficiosPolitica(BusinessEntity.Parameter.FiltroControleBeneficioChave entity)
        {
            StringBuilder sql = new StringBuilder();

            sql.AppendLine("DELETE FROM TBOCORR_BENEF");
            sql.AppendLine("WHERE");
            sql.AppendLine("    CD_POLITICA = :CodigoPolitica");
            sql.AppendLine("    AND DT_INICIAL = :DataInicial");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, "CodigoPolitica", DbType.Int32, entity.CodigoPolitica);
                this.DataBase.AddInParameter(command, "DataInicial", DbType.DateTime, entity.DataInicial);

                this.DataBase.ExecuteNonQuery(command);
            }
        }

        /// <summary>
        /// Exclui um controle de benefício de política de corretagem.
        /// </summary>
        /// <param name="entity"></param>
        public void ExcluirControleBeneficio(BusinessEntity.Parameter.FiltroControleBeneficioChave entity)
        {
            StringBuilder sql = new StringBuilder();

            sql.AppendLine("DELETE FROM TBOCORR_BENEF");
            sql.AppendLine("WHERE");
            sql.AppendLine("    CD_POLITICA = :CodigoPolitica");
            sql.AppendLine("    AND DT_INICIAL = :DataInicial");
            sql.AppendLine("    AND TP_BENEF = :TipoBeneficio");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, "CodigoPolitica", DbType.Int32, entity.CodigoPolitica);
                this.DataBase.AddInParameter(command, "DataInicial", DbType.DateTime, entity.DataInicial);
                this.DataBase.AddInParameter(command, "TipoBeneficio", DbType.Int32, entity.TipoBeneficio.Codigo);

                this.DataBase.ExecuteNonQuery(command);
            }
        }

        /// <summary>
        /// Duplica a lista de controles de beneficios para nova politica de corretagem
        /// baseando-se em outra política de corretagem
        /// </summary>
        /// <param name="politicaOrigem"></param>
        /// <param name="politicaDestino"></param>
        public void DuplicarControlesBeneficiosPolitica(BusinessEntity.Parameter.FiltroPoliticaCorretagemChave politicaOrigem, BusinessEntity.Parameter.FiltroPoliticaCorretagemChave politicaDestino)
        {
            StringBuilder sql = new StringBuilder();

            sql.AppendLine("INSERT INTO TBOCORR_BENEF(");
            sql.AppendLine("SELECT :PoliticaDestinoCodigo,");
            sql.AppendLine("TP_BENEF,");
            sql.AppendLine(":PoliticaDestinoDataInicial,");            
            sql.AppendLine("NR_VAL_QTDE");
            sql.AppendLine("FROM");
            sql.AppendLine("    TBOCORR_BENEF");
            sql.AppendLine("WHERE");
            sql.AppendLine("    CD_POLITICA = :PoliticaOrigemCodigo");
            sql.AppendLine("AND DT_INICIAL = :PoliticaOrigemDataInicial)");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, "PoliticaDestinoCodigo", DbType.Int32, politicaDestino.Codigo);
                this.DataBase.AddInParameter(command, "PoliticaDestinoDataInicial", DbType.DateTime, politicaDestino.DataInicial);
                this.DataBase.AddInParameter(command, "PoliticaOrigemCodigo", DbType.Int32, politicaOrigem.Codigo);
                this.DataBase.AddInParameter(command, "PoliticaOrigemDataInicial", DbType.DateTime, politicaOrigem.DataInicial);

                this.DataBase.ExecuteNonQuery(command);
            }
        }

        /// <summary>
        /// Inclui um controle de beneficio de política de corretagem
        /// </summary>
        /// <param name="entity"></param>
        public void IncluirControleBeneficio(BusinessEntity.ControleBeneficio entity)
        {
            StringBuilder sql = new StringBuilder();

            sql.AppendLine("INSERT INTO TBOCORR_BENEF(");
            sql.AppendLine("    CD_POLITICA,");
            sql.AppendLine("    DT_INICIAL,");
            sql.AppendLine("    TP_BENEF,");
            sql.AppendLine("    NR_VAL_QTDE)");
            sql.AppendLine("VALUES(");
            sql.AppendLine("    :CodigoPolitica,");
            sql.AppendLine("    :DataInicial,");
            sql.AppendLine("    :TipoBeneficio,");
            sql.AppendLine("    :ValorQuantidade)");

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, "CodigoPolitica", DbType.Int32, entity.CodigoPolitica);
                this.DataBase.AddInParameter(command, "DataInicial", DbType.DateTime, entity.DataInicial);
                this.DataBase.AddInParameter(command, "TipoBeneficio", DbType.Int32, entity.TipoBeneficio.Codigo);
                this.DataBase.AddInParameter(command, "ValorQuantidade", DbType.Decimal, entity.ValorQuantidade);

                this.DataBase.ExecuteNonQuery(command);
            }
        }
        #endregion
    }
}